public class Date {

    public int year;
    public int month;
    public int day;
    //形参名字和实参名字一样了
    //三个对象都在调用函数，但是这两个函数没有任何关于对象的说明
    //编译器编译之后将成员方法的隐藏的this参数还原，在方法中所有的成员变量都通过this引用来访问
    //

    //在前面的学习中，在java方法内部定义一个局部变量的时候，必须要初始化
    //否则会编译失败
    //

    public Date(){
        this(1900,1,1);
        //注意this（）必须是构造方法中的第一条语句
        //不能形成环

    }
    //形成构造器的递归调用
    //
    //大多情况下被public来修饰，
    //特殊情况下会被private修饰
    //单例模式
    //


    //默认初始化
    //现在回到为什么局部变量在使用时候必须要初始化，而成员变量不用呢？

    //要搞清楚这个过程就要明白，new关键字背后的故事
    //

    //在程序层面只是简简单单的一个语句，在jvm层面需要做好多事
    //
    //1.检测对象对应的类是否加载了，如果没有加载，那么便加载
    //2.为对象分配空间
    //处理并发安全问题
    //比如：多个线程同时申请对象，jvm要保证给对象分配的空间不冲突
    //

    //初始化所分配的空间
    //即，对象空间被申请好之后，对象中包含的成员已经设置好了初始化值
    //设置对象头信息（关于对象内存模型）
    //调用构造方法，给对象中所有的成员赋值
    //要是你不写构造犯法，编译器给的是空构造方法
    //相当于没有改变之前初始化放入的值
    //

    //就地初始化代码

    //在声名成员变量的时候，就已经给出了初始值

    //代码编译完成后，编译器会将所欲给成员初始化的这些语句添加到各个构造函数中

    //所以就地初始化，实际上，是编译器对默认编写的构造方法去做的一些改写
    //不简单的让他仅仅是一个空构造方法

    
    public Date(int year,int month,int day){
        //this();
        this.year=year;
        this.month=month;
        this.day=day;
        System.out.println("Date(int,int,int)方法被调用了");
    }
    public void setDate(Date this,int year,int month,int day){
        this.year=year;
        this.month=month;
        this.day=day;
    }
    public void printData(Date this){
        System.out.println(this.year+"-"+this.month+"-"+this.day);
    }

    public static void main(String[] args) {
        //this引用指向当前对象
        //当前对象（成员方法运行时候调用该成员的方法的对象）
        //在成员方法中所有成员变量的操作，都是通过该引用去访问。
        //只不过所有的操作对用户是透明的，即用户不需要去传递，编译器自动完成
        //
        //this引用的是调用成员方法的对象
//        Date d1=new Date();
//        Date d2=new Date();
//        Date d3=new Date();
//
//        d1.setDate(2004,8,18);
//        d2.setDate(2023,10,21);
//        d3.setDate(2004,8,19);
//
//        d1.printData();
//        d2.printData();
//        d3.printData();
        //int a;
        //System.out.println(a);
        //可能尚未初始化变量a
        //正式使用前请给设置一个初始值
        //如果是对象可以正常通过编译
        //



        //
        Date d=new Date(2004,8,19);
        //你在new的时候，算是调用了一个方法
        //有小圆括号
        //
        d.printData();//在此处却可以正常的使用
        //
        //每次对象创建好之后，去调用setDate方法设置具体日期，比较麻烦，那对象该如何初始化
        //局部变量必须要初始化才能够使用，为什么字段声名之后没有值依然可以使用？？？？？？


        d.setDate(2004,8,18);
        d.printData();
    }

    //this的类型：对应类类型引用，即那个对象调用就是那个对象的引用
    //this只能在成员方法中使用
    //在成员方法中，this只能引用当前对象，不能在引用其他对象
    //this是成员方法的第一个隐藏的参数，编译器会自动传递，在成员方法执行时候，编译器会负责将调用成员方法对象的引用传递给该成员方法，this负责来接收
    //

    //此时隐藏的构造方法，（也就是构造器）
    //是一个特殊的成员方法
    //名字必须与类名一样，在创建对象时候，编译器会自动调用
    //并且在整个生命周期内只调用一次。

    //名字必须与类名相同
    //没有返回值类型，设置为void也是不允许的
    //设置对象时候，编译器自动调用，并且只在对象的生命周期内只调用一次（相当于人的出生，每个人只能出生一次
    //构造方法可以重载
    //（用户可以根据自己的需求，去提供不同的参数的构造方法
    //救急不救穷

    //上面的两个构造方法，名字相同，参数列表不同，因此构成了方法的重载
    //如果用户没有显示定义。编译器会自动生成一个默认的构造方法，生成的默认构造方法一定是没有参数的
    //
    //构造方法中什么都没有
    //
    //构造方法中可以通过this调用其他的构造方法来简化代码



    //
}
